/*
 * Copyright (c) 2022  by Junzhao
 * THIS FILE IS PART OF JAVASE Song Huongkang PROJECT
 * All Rights Reserved.
 */

package Set;

import org.junit.Test;

import java.util.*;

/**
 * @description Set接口
 * |----Collection接口：单列集合一个一个的对象
 *          |----Set接口：储存无序，不可重复的数据 -->高中的集合 “互异性”“确定性“”无序性”
 *                 |----HashSet     最为主要实现类 线程不安全 可以储存null
 *                          |----LinkedHashSet 作为HashSet的子类 遍历内部数据是可以按照添加顺序遍历
 *                                             遍历的效率高于HashSet
 *                 |----TreeSet    可以按照添加对象的指定属性进行排序 使用二叉树(红黑树)储存数据 数据必须是一个类的
 *
 *         没有额外的方法 都是实现了Collection中的方法
 *
 * @author 俊昭
 * @date 2022/4/19
*/
public class SetTest {
    @Test
    public void text01(){
        Set s1 = new HashSet();
        s1.add("123");
        s1.add("123");// 重复的Set元素
        s1.add(456);
        s1.add(new User("ZhangSan",18));
//        s1.add(new Person("ZhangSan",18));
        s1.add(true);
        s1.add(new User("ZhangSan",18));

        // 无序

        // !=随机性
        // 并非按照数组索引顺序添加而是根据哈希值决定
        Iterator it1 = s1.iterator();
        while (it1.hasNext()){
            System.out.println(it1.next());
        }
        //Person{name='ZhangSan', age=18}
        //123
        //456
        //true


        // 不可重复
        // 保证equals方法判断是不返回true 也就是相同元素只存在一个
        // 发现重写了equals()方法也输出了两个相同的User对象
        // Set里的元素重不重复是 先由hashcode()决定再调用equals
        //User{name='ZhangSan', age=18}
        //123
        //456
        //User{name='ZhangSan', age=18}
        //true

        // 重写hashcode方法后‘
        //123
        //User{name='ZhangSan', age=18}
        //456
        //true



    }
}
